/**
  ******************************************************************************
  * @file    main.c
  * @author  bug2222
  * @version V1.0
  * @date    2025-09-19
  * @brief   EC800M 4G模块测试 - 合并版本（DHT11数据发送 + LED控制）
  ******************************************************************************
  */ 
 
#include "stm32f10x.h"
#include "core_delay.h"
#include "bsp_usart.h"
#include "bsp_SysTick.h"
#include "bsp_ec800m.h"
#include "bsp_dht11.h"
#include "bsp_led.h"
#include "bsp_ili9341_lcd.h"
#include "bsp_relay.h"
#include "bsp_key.h"

#include "flash.h"
#include "Storage_Adapter.h"
#include "watchdog.h"
#include "common.h"
#include "timedate.h"
#include "bsp_switch.h"

/* 外部变量声明 */
extern int read_dht11_finish;
extern volatile uint8_t key_pressed; // 按键按下标志
DHT11_Storage_Data_TypeDef storage_data;
/**
  * @brief  打印W25Q64中存储的DHT11数据
  * @param  无
  * @retval 无
  */
void Print_W25Q64_DHT11_Data(void)
{
  printf("\r\n=== W25Q64中存储的最新DHT11数据 ===\r\n");
  
  if(DHT11_Storage_HasValidData())
  {
    if(DHT11_Storage_ReadLatestData(&storage_data) == STORAGE_SUCCESS)
    {
//      printf("温度: %d.%d℃\r\n", storage_data.temp_int, storage_data.temp_deci);
//      printf("湿度: %d.%d%%RH\r\n", storage_data.humi_int, storage_data.humi_deci);
      printf("校验和: 0x%02X\r\n", storage_data.check_sum);
      printf("数据状态: %s\r\n", (storage_data.valid_flag == 0xAA) ? "有效" : "无效");
      printf("总记录数: %d\r\n", DHT11_Storage_GetRecordCount());
      printf("存储模式: %s\r\n", 
             (DHT11_Storage_GetMode() == 0) ? "覆盖模式" : "环形缓冲模式");
      
      // 更新OLED显示
      char tempStr[8];
      sprintf(tempStr,"%2d.%d C",storage_data.temp_int,storage_data.temp_deci);
      ILI9341_DispStringLine_EN(LINE(7),tempStr);
      
      char humiStr[8];
      sprintf(humiStr,"%2d.%d %%",storage_data.humi_int,storage_data.humi_deci);
      ILI9341_DispStringLine_EN(LINE(9),humiStr);
    }
    else
    {
      printf("读取W25Q64数据失败\r\n");
    }
  }
  else
  {
    printf("W25Q64中暂无有效数据\r\n");
  }
  printf("================================\r\n");
}

/* 判断复位原因 */
void judgeReset(void){
	/*判断复位信号来源*/
	if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)	//如果是独立看门狗复位
	{
		printf("WATCHDOG_RESET\r\n");
		RCC_ClearFlag();  // 清除所有复位标志
	}
	else											//否则，即为其他复位
	{
		printf("NORMAL_RESET\r\n");
		RCC_ClearFlag();  // 清除所有复位标志
	}
}

extern uint16_t lcdid;

/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main ( void )
{
	Storage_Status_TypeDef storage_status;
	
	/* 初始化 */
  USART_Config ();                                                      //初始化串口1
	EC800M_UART_Init();                                                   //初始化无线模块串口
	judgeReset();
	WATCHDOG_Init();																											//看门狗初始化
	printf("看门狗初始化完成，超时时间约20秒\r\n");
  CPU_TS_TmrInit();                                                     //初始化DWT计数器，用于延时函数
  LED_GPIO_Config();                                                    //初始化RGB彩灯
	LED_RED;																															//红灯亮-未连接服务器
	RELAY_GPIO_Config();                                                  //初始化继电器
	KEY_GPIO_Config();                                                    //初始化按键
	DHT11_Init ();                                                        //初始化DHT11
	ILI9341_Init ();         																							//LCD 初始化
	SWITCH_GPIO_Config(); //接近开关初始化
	
	/*演示显示变量*/
	LCD_SetFont(&Font8x16);
	LCD_SetColors(RED,BLACK);

  ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);	/* 清屏，显示全黑 */
	/********显示字符串示例*******/
  if(lcdid == LCDID_ILI9341)
  {
    ILI9341_DispStringLine_EN(LINE(0),"BH 2.8 inch LCD para:");
    ILI9341_DispStringLine_EN(LINE(1),"Image resolution:240x320 px");
    ILI9341_DispStringLine_EN(LINE(2),"ILI9341 LCD driver");
    ILI9341_DispStringLine_EN(LINE(3),"XPT2046 Touch Pad driver");
  }
  else if(lcdid == LCDID_ST7789V)
  {
    ILI9341_DispStringLine_EN(LINE(0),"BH 3.2 inch LCD para:");
    ILI9341_DispStringLine_EN(LINE(1),"Image resolution:240x320 px");
    ILI9341_DispStringLine_EN(LINE(2),"ST7789V LCD driver");
    ILI9341_DispStringLine_EN(LINE(3),"XPT2046 Touch Pad driver");
  }
	
	/* 初始化RTC */
	printf("\r\n正在初始化RTC时钟...\r\n");
	ILI9341_DispStringLine_EN(LINE(5),"RTC CLOCK INITIALIZING...");
	RTC_Configuration();
	LCD_ClearLine(LINE(5));
	ILI9341_DispStringLine_EN(LINE(5),"RTC CLOCK INITIALIED");
	
	SysTick_Init ();     //配置 SysTick 为 10ms 中断一次，在中断里读取传感器数据
	
	/* 初始化W25Q64存储系统 */
	printf("\r\n正在初始化W25Q64存储系统...\r\n");
	storage_status = Storage_Init();
	if(storage_status == STORAGE_SUCCESS)
	{
		printf("W25Q64存储系统初始化成功！\r\n");
		
		/* 显示存储系统信息 */
		DHT11_Storage_PrintInfo();
		
		/* 检查现有数据 */
		if(DHT11_Storage_HasValidData())
		{
			printf("发现现有数据，总记录数: %d\r\n", DHT11_Storage_GetRecordCount());
		}
		else
		{
			printf("W25Q64中暂无有效数据\r\n");
		}
	}
	else
	{
		printf("W25Q64存储系统初始化失败！错误码: %d\r\n", storage_status);
		printf("程序将继续运行，但不会保存数据到W25Q64\r\n");
	}

	//温度
	ILI9341_DispStringLine_EN(LINE(6),"TEMPERATURE:");
	
	//湿度
	ILI9341_DispStringLine_EN(LINE(8),"HUMIDITY:");
	Print_W25Q64_DHT11_Data();
	
  EC800M_4G_Init();
  
	CSTX_4G_ConTCP();//关闭上一次连接
	CSTX_4G_CreateTCPSokcet();//创建一个SOCKET连接
  while ( 1 )
  {
    IWDG_ReloadCounter();             //喂狗
    
    // 检查按键状态，控制继电器
    if(key_pressed)  // 检查按键标志
    {
      key_pressed = 0;  // 清除按键标志
      
      // 切换继电器状态
      if(RELAY1_GetState())
      {
        RELAY1_OFF();
        printf("\r\n按键按下：继电器已关闭\r\n");
      }
      else
      {
        RELAY1_ON();
        printf("\r\n按键按下：继电器已打开\r\n");
      }
      
      // 延时防抖
      Delay_ms(200);
    }
    
    if( read_dht11_finish ) // read_dht11_finish == 1 or read_dht11_finish == -1
    {
      read_dht11_finish = 0;       // 清除标志位
      /* 打印已存储的数据 */
      Print_W25Q64_DHT11_Data();
      
      // 发送DHT11温湿度数据到4G服务器
      if(DHT11_Storage_HasValidData())
      {
        if(DHT11_Storage_ReadLatestData(&storage_data) == STORAGE_SUCCESS)
        {
          printf("开始通过4G发送DHT11数据...\r\n");
          CSTX_4G_SendDHT11Data(&storage_data);
        }
        else
        {
          printf("读取DHT11数据失败，无法发送\r\n");
        }
      }
      else
      {
        printf("暂无有效的DHT11数据可发送\r\n");
      }
      
    }
		
		uint8_t s = SWITCH_Read();
		if(s){
			//接近开关
		}
    
  }
	
	
}



